﻿using System;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.CSharp;
using System.Linq;

namespace TestProject
{
	public class Class1
	{
		public static void GetAssemlies()
		{
			var assemlies = AppDomain.CurrentDomain.GetAssemblies().Select(x => x.FullName);
		}
		public static string strCode = @"using System; 
　　                                  public class Program 
　　                                  { 
　　                                          public static void Main() 
　　                                          { 
　　                                                  Console.WriteLine(""hello,man!""); 
　　                                          } 
                                                public static void PrintWorld()
                                                {
　　                                                  Console.WriteLine(""hello,world!""); 
                                                }
　　                                  } 
　　                               ";
		public static Assembly CompilerMain(string[] codes)
		{
			codes = strCode.Split('{').ToArray() ;
			#region 编译参数
			CompilerParameters objCompilerParams = new CompilerParameters();

			//编译器选项：编译成（存储在内存中）的DLL
			objCompilerParams.CompilerOptions = "/target:library /optimize";

			//编译时在内存输出 
			objCompilerParams.GenerateInMemory = true;

			//不生成调试信息 
			objCompilerParams.IncludeDebugInformation = true;
			#endregion

			#region 编译
			//创建编译类
			CSharpCodeProvider objCompiler = new CSharpCodeProvider();

			//进行编译
			CompilerResults objCompileResults = objCompiler.CompileAssemblyFromSource(objCompilerParams, codes);
			#endregion

			#region 取得编译成程序集，准备执行程序集里的类中的方法
			//获取编译结果：程序集
			Assembly objAssembly = objCompileResults.CompiledAssembly;

			return objAssembly;
			////获取编译成的程序集的信息
			//object objMainClassInstance = objAssembly.CreateInstance("Program");

			//Type objMainClassType = objMainClassInstance.GetType();
			//#endregion

			//#region 调用程序集中的类，执行类中的方法，得到结果
			//objMainClassType.GetMethod("Main").Invoke(objMainClassInstance, null);

			//objMainClassType.GetMethod("PrintWorld").Invoke(objMainClassInstance, null);
			#endregion
		}
	}
}